package com.xs;

import java.util.List;

import com.alibaba.fastjson.JSON;
import com.xs.client.entity.RpcRequest;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

public class SimpleDecoder extends ByteToMessageDecoder {

	
	private Class<?> genericClass;
	
	/**
	 * 
	 */
	public SimpleDecoder(Class<?> genericClass) {
		this.genericClass = genericClass;
	}
	
	
	
	@Override
	protected void decode(ChannelHandlerContext ctx, ByteBuf bufferIn, List<Object> out) throws Exception {

		if (bufferIn.readableBytes() < 8) {
			return;
		}

		int command = bufferIn.readInt();// 读取命令数据

		bufferIn.markReaderIndex(); // 我们标记一下当前的readIndex的位置

		int dataLength = bufferIn.readInt(); // 读取传送过来的消息的长度。ByteBuf
												// 的readInt()方法会让他的readIndex增加4
		if (dataLength < 0) { // 我们读到的消息体长度为0，这是不应该出现的情况，这里出现这情况，关闭连接。
			ctx.close();
		}

		if (bufferIn.readableBytes() < dataLength) { // 读到的消息体长度如果小于我们传送过来的消息长度，则resetReaderIndex.
														// 这个配合markReaderIndex使用的。把readIndex重置到mark的地方
			bufferIn.resetReaderIndex();
			return;
		}

		byte[] body = new byte[dataLength]; // 嗯，这时候，我们读到的长度，满足我们的要求了，把传送过来的数据，取出来吧~~
		bufferIn.readBytes(body); //

		CustomProtcol protocol = new CustomProtcol(command, body.length,
				JSON.parseObject(new String(body), genericClass));

		out.add(protocol);
	}

}
